System and method for generating cyclic redundancy check

ABSTRACT

Techniques are provided for creating a Cyclic Redundancy Check generator in a system. According to one aspect of the invention, a universal N-bit capable CRC generator is created and programmed to adapt to any given polynomial key word. According to one feature, the N-bit capable CRC generator comprises N shift registers that are associated with corresponding exclusive-OR gates (XOR gates). Each of the shift registers corresponds to a term of an imaginary N th  order polynomial. Thus, by nullifying a subset of the shift registers and their corresponding XOR gates, the N-bit capable CRC generator can be converted into a specific polynomial key word CRC generator. The selection of the subset of the shift registers and their corresponding XOR gates is based on the desired polynomial key word. The N-bit capable CRC generator can be re-programmed each time a new polynomial key word is desired.

CROSS-REFERENCE TO RELATED APPLICATION

[0001] This application claims the priority benefit of U.S. Provisional Patent Application Serial No. 60/338,137, filed Nov. 9, 2001, entitled, “SYSTEM AND METHOD FOR GENERATING A CYCLIC REDUNDANCY CHECK.”

FIELD OF THE INVENTION

[0002] The invention generally relates to electronic systems. The invention relates more specifically to systems and methods for generating cyclic redundancy check.

BACKGROUND OF THE INVENTION

[0003] A popular method for error detection for digital signals is the Cyclic Redundancy Check (CRC). CRC works by treating the message string that is sent between a transmitter and a receiver as a single binary word. The single binary word is divided by a key word that is agreed upon by both the transmitter and the receiver ahead of time. The remainder that is left after dividing the single binary word by the key word is known as a check word. The transmitter sends both the message string and the check word to the receiver. The receiver then verifies the data by dividing the data by the key word. If the remainder, obtained by dividing the data by the key word, matches the check word, then the receiver can be sure that the data is indeed the correct message string from the transmitter.

[0004] In the context of CRC, key words are usually numbers and are presented in the form of polynomials whose coefficients are in the form of the binary bits of the key word. A popular key word is X¹⁶+X¹²+X⁵+1 known as the X25 standard. Key words will herein be referred to as polynomial key words.

[0005] CRC is often implemented in hardware that is specific to a given polynomial key word. A CRC that is implemented in hardware is herein referred to as a CRC generator. Thus, a system that has to verify data using various different polynomial key words will need a separate CRC generator that is dedicated to each distinct polynomial key word. For example, FIG. 1 is a block diagram that illustrates a CRC generator that employs a 3^(rd) order polynomial key word, X³+X²+1.

[0006] In FIG. 1, exclusive-OR gates (XOR gates) 110, 112, and 116 are communicatively coupled to each other and to corresponding shift registers 102, 104 and 106. Input 101 is initially received at XOR gate 110. The output of the CRC generator in FIG. 1 is 118.

[0007]FIG. 2 is block diagram that illustrates a CRC generator that employs a 1st order polynomial key word, X¹+1. In FIG. 2, XOR gates 210, and 212 are communicatively coupled to each other and to corresponding shift registers 202, and 204. Input 220 is initially received at XOR gate 210. The output of the CRC generator in FIG. 2 is 222.

[0008] A system with multiple CRC generators can be unwieldy and inefficient.

[0009] Based on the foregoing, it is clearly desirable to reduce the number of CRC generators in a given system.

[0010] It is further desirable to have a programmable CRC generator so that the CRC generator can be dynamically changed to accommodate different applications.

SUMMARY OF THE INVENTION

[0011] Techniques are provided for creating a Cyclic Redundancy Check generator in a system. According to one aspect of the invention, a universal N-bit capable CRC generator is created and programmed to adapt to any given polynomial key word. According to one feature, the N-bit capable CRC generator comprises N shift registers that are associated with corresponding exclusive OR gates (XOR gates). Each of the shift registers corresponds to a term of a general N^(th) order polynomial key word. Thus, by nullifying a subset of the shift registers and their corresponding XOR gates, the N-bit capable CRC generator can be converted into a specific polynomial key word CRC generator. The selection of the subset of the shift registers and their corresponding XOR gates is based on the desired polynomial key word. The N-bit capable CRC generator can be re-programmed each time a new polynomial key word is desired.

[0012] In other aspects, the invention encompasses a computer apparatus, a computer readable medium, and a carrier wave configured to carry out the foregoing steps.

[0013] An advantage of using an N-bit capable CRC generator is that it can dynamically programmed to accommodate a new polynomial key word rather than having build a new CRC generator for each new polynomial key word.

BRIEF DESCRIPTION OF THE DRAWINGS

[0014] The present invention is illustrated by way of example, and not by way of limitation, in the figures of the accompanying drawings and in which like reference numerals refer to similar elements and in which:

[0015]FIG. 1 is a block diagram that illustrates a prior art CRC generator that employs a 3^(rd) order polynomial key word;

[0016]FIG. 2 is block diagram that illustrates a prior art CRC generator that employs a 1st order polynomial key word;

[0017]FIG. 3A is block diagram that illustrates an exemplary N-bit capable CRC generator;

[0018]FIG. 3B is a block diagram that illustrates the most significant bit (MSB) to the least significant bit (LSB) in relation to programmable registers;

[0019]FIG. 4 is a block diagram that illustrates the position of the MSB that is associated with a q^(th) order polynomial key word;

[0020]FIG. 5 is a block diagram that illustrates a 3-bit capable CRC generator;

[0021]FIG. 6 is a block diagram that illustrates the position of the MSB that is associated with a X³+X²+1 key word;

[0022]FIG. 7 is a block diagram that illustrates the position of the MSB that is associated with a X¹+X⁰ key word;

DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENT

[0023] A system and method for generating a cyclic redundancy check is described. In the following description, for the purposes of explanation, numerous specific details are set forth in order to provide a thorough understanding of the present invention. It will be apparent, however, to one skilled in the art that the present invention may be practiced without these specific details. In other instances, well-known structures and devices are shown in block diagram form in order to avoid unnecessarily obscuring the present invention. Embodiments are described herein according to the following outline:

[0024] 1.0 OPERATIONAL CONTEXT AND FUNCTIONAL OVERVIEW

[0025] 2.0 N-BIT CAPABLE CRC GENERATOR

[0026] 3.0 ILLUSTRATIVE EXAMPLE OF THE FLEXIBILITY OF AN N-BIT CAPABLE CRC GENERATOR

[0027] 5.0 EXTENSIONS AND ALTERNATIVES

[0028] 1.0 Operational Context and Functional Overview

[0029] In certain embodiments of the present invention, a universal CRC generator is used in a system that receives digital signals. The universal CRC generator can be programmed to be a specific polynomial key word CRC generator. Thus, one set of hardware can be adapted for any given polynomial key word. For example, for purposes of explanation, assume that a transmitter of a bitstream and a receiver of the same bitstream agree upon a key word that can be represented by the polynomial, X¹⁶+X¹²+X⁵+1. The universal CRC can be programmed to be an X¹⁶+X¹²+X⁵+1 polynomial key word CRC generator. Generally, an N^(th) polynomial key word CRC generator is also referred to as an N-bit CRC generator. Each time that the key word is changed, the universal CRC_(generator) can be re-programmed to correspond to the new key word. It is to be noted that an N^(th) order polynomial key word has (N+1) bits.

[0030] Thus, in certain embodiments of the present invention, the universal CRC generator is a CRC generator that is capable of being a N-bit CRC generator, where N is a positive integer that is selected corresponding to the highest order polynomial key word that the universal CRC generator is expected to use. A universal generator that is capable of being an N-bit CRC generator is herein referred to as an “N-bit capable” CRC generator.

[0031] According to certain embodiments of the present invention, the universal CRC generator can be re-programmed to correspond to a new polynomial key word by programming the values of certain programmable registers that are part of the universal CRC generator and by programming certain selection inputs for multiplexers that are also part of the universal CRC generator. The programming of the registers and selection inputs for the multiplexers are explained in greater detail herein.

[0032] 2.0 N-Bit Capable CRC Generator

[0033] According to certain embodiments of invention, FIG. 3A is block diagram that illustrates an N-bit capable CRC generator. An N-bit capable CRC generator is a universal CRC generator for which the highest order polynomial key word is N. Thus, an N-bit capable CRC generator can be used for polynomial key words of orders ranging from 1 to N. The N-bit CRC generator of FIG. 3A comprises the following as indicated in List A.

[0034] List A:

[0035] 1) N+1 number of shift registers, namely, X^(n) 310, X^((n−1)) 312, . . . , X⁰ 314;

[0036] 2) N+1 number of exclusive-OR gates, namely, XOR^(n) 316, XOR^((n−1)) 318, . . . , XOR⁰ 320;

[0037] 3) 3N+1 number of multiplexers, namely, M_(a) ^(n) 322, M_(a) ^((n−1)) 324, M_(b) ^((n−1)) 326, M_(c) ^((n−1)) 328, . . . , M_(a) ⁰ 330, M_(b) ⁰ 332, M_(c) ⁰ 334; and

[0038] 4) N+1 programmable registers, namely, Y^(n) 336, Y^((n−1)) 338, . . . , Y⁰ 340.

[0039] The broken line 302 in FIG. 3A indicates that the following components as indicated in List B are not shown on FIG. 3A for want of space.

[0040] List B:

[0041] 1) shift registers X^((n−2)), X^((n−3)), up to X¹;

[0042] 2) exclusive-OR gates XOR^((n−2)), XOR^((n−31)), . . . , up to XOR¹;

[0043] 3) multiplexes M_(a) ^((n−2)), M_(b) ^((n−2)), M_(c) ^((n−2)), . . . , up to M_(a) ¹, M_(b) ¹, M_(c) ¹;

[0044] 4) programmable registers Y^((n−2)), Y^((n−3)), . . . , up to Y¹;

[0045] Each of the shift registers X is communicatively coupled to a corresponding exclusive-OR gate (XOR gate) and to adjacent multiplexers M. For example, in FIG. 3A, shift register X^(n) 310 is communicatively coupled to a corresponding XOR gate, XOR^(n) 316. Specifically, line 368 is shown as the output from X^(n) 310. Line 368 is also the input to XOR gate, XOR^(n) 316. Similarly, shift register X^(n−1) 312 is communicatively coupled to a corresponding XOR gate, XOR^(n−1) 318, etc. Line 378 is shown as the output from X^(n−1) 312. Line 378 is also the input to XOR gate, XOR^(n−1) 318. However, shift register X⁰ 314 is communicatively coupled to only one XOR gate, viz., XOR⁰ 320. Line 390 is shown as the output from X⁰ 314. Line 390 is also the input to XOR gate, XOR⁰ 320.

[0046] Further, each of the shift registers X in FIG. 3A is communicatively coupled to corresponding adjacent multiplexers M. For example, shift register X^(n) 310 is communicatively coupled to adjacent multiplexers M_(a) ^(n) 322 and M_(a) ^((n−1)) 324. Specifically, line 366 is shown as an output from shift register X^(n) 310. Line 366 is also the input to multiplexer M_(a) ^(n) 322. Line 372 is shown as an output from multiplexer M_(a) ^(n−1) 324. Line 372 is also an input to shift register X^(n) 310.

[0047] Similarly, shift register X^(n−1) 312 is communicatively coupled to adjacent multiplexers M_(a) ^(n−1) 324, etc. Specifically, line 376 is shown as an output from shift register X^(n−1) 312. Line 376 is also the input to multiplexer M_(a) ^(n−1) 324. Line 382 is shown as an output from multiplexer M_(a) ^(n−2) (note that M_(a) ^(n−2) is not shown in FIG. 3A). Line 382 is also an input to shift register X^(n−1) 312.

[0048] Shift register X⁰ 314 is communicatively coupled to adjacent multiplexer M_(a) ⁰ 330. Specifically, line 391 is shown as an output line from shift register X⁰ 314. Line 391 is also an input line to multiplexer M_(a) ⁰ 330. Line 393 is shown as an output line from multiplexer M_(b) ⁰ 332. Line 393 is also an input line to shift register X⁰ 314.

[0049] Further, all shift registers X^(n) 310, X^((n−1)) 312, . . . , X⁰ 314 in FIG. 3A are communicatively coupled to multiplexer M_(out) 342 via lines An 344, A^(n−1) 346, . . . , up to A⁰ 348. For example, shift register X^(n) 310 is connected to M_(out) 342 via line A^(n) 344. Shift register X^(n−1) 312 is connected to M_(out) 342 via line A^(n−1) 346, etc. Further, CRC output 350 is the output of the N-bit capable CRC generator.

[0050] Each XOR gate is additionally communicatively coupled to corresponding adjacent multiplexers. For example, in FIG. 3A, XOR gate XOR^((n−1)) 318 is communicatively coupled to adjacent corresponding multiplexers M_(a) ^((n−1)) 324 and M_(c) ^((n−1)) 328. Specifically, line 380 is shown as an input line from multiplexer M_(c) ^((n1−1)) 328 to XOR gate XOR^((n−1)) 318. Line 374 is an output line from XOR gate XOR^((n−1)) 318 to multiplexer M_(a) ^((n−1)) 324.

[0051] Similarly, XOR gate XOR⁰ 320, is communicatively coupled to adjacent corresponding multiplexers M_(a) ⁰ 330 and M_(c) ⁰ 334, etc. Specifically, line 396 is shown as an input line from multiplexer M_(c) ⁰ 334 to XOR gate XOR⁰ 320. Line 388 is an output line from XOR gate XOR⁰ 320 to multiplexer M_(a) ⁰ 330. However, XOR gate XOR^(n) 316 is communicatively coupled to only one adjacent corresponding multiplexer M_(a) ^(n) 322. Line 364 is shown as an output line from XOR^(n) 316 to multiplexer M_(a) ^(n) 322.

[0052] Programmable registers Y^(n) 336, Y^((n−1)) 338, . . . , Y⁰ 340 are each communicatively coupled to a corresponding multiplexer. For example, programmable register Y^(n) 336 is communicatively coupled to multiplexer M_(a) ^(n) 322, programmable register Y^((n−1)) 338 is coupled to multiplexer M_(a) ^((n−1)) 324, etc.

[0053] For simplicity, programmable registers Y^(n) 336, Y^((n−1)) 338, . . . , Y⁰ 340 are collectively referred to herein as Y registers.

[0054] The Y registers are programmed based on the given polynomial key word. To explain, each Y register in the N-bit capable CRC generator is associated with one term in the general N^(th)-order polynomial, C_(n)X^(n)+C_(n−1)X^(n−1)+C_(n−2)X^(n−2)+ . . . +C₂X²+C₁X¹+C₀X⁰, where C_(n), C_(n−1), C_(n−2), . . . , C₂, C₁, and C₀ are the coefficients of the general Nth-order polynomial and are constants.

[0055] Each Y register corresponds to one coefficient of the general N^(th)-order polynomial. Specifically, programmable register Y^(n) 336 in FIG. 3A corresponds to coefficient C_(n), programmable register Y^(n−1) 338 corresponds to coefficient C_(n−1) and so on. The given polynomial key word is compared to the general N^(th) order polynomial to determine which of the coefficients of the general N^(th)-order polynomial are to take the value of zero in order to convert the N^(th)-order general polynomial into the given polynomial key word.

[0056] The Y registers that correspond to coefficients that have a value of zero are programmed to have a bit value of zero. The Y registers that correspond to coefficients that have a value of 1 are programmed to have a bit value of 1.

[0057] The value of each bit in the Y register determines which input is selected at the corresponding multiplexer to be an output. For example, if programmable register Y^(n) 336 is programmed to have a bit value of 1, multiplexer M_(a) ^(n) 322 will receive the value 1 as an input from programmable register Y^(n) 336. In FIG. 3A, it can be seen that multiplexer M_(a) ^(n) 322 has 2 input lines, labeled “1” and “0” respectively. Since the value 1 is received from programmable register Y^(n) 336 multiplexer M_(a) ^(n) 322 will select the input line labeled “1” to be the output of M_(a) ^(n) 322 for a particular cycle.

[0058]FIG. 3B is a block diagram that illustrates the most significant bit (MSB) to the least significant bit (LSB) in relation to the programmable registers Y 370. Bit B_(n) corresponds to the value in register Y^(n) 336, and is the MSB if the value of Y^(n) 336 is the first occurring “1” bit. Similarly, bit B_(n−1) corresponds to the value in register Y^(n−1) 338, etc. Bit Bo corresponds to the value in register Y⁰ 340, and is the LSB.

[0059] For ease of explanation, multiplexers with the same superscript as illustrated in FIG. 3A are said to belong to the same family. As can be seen in FIG. 3A, multiplexers that belong to the same family are communicatively coupled to form part of a feedback loop. For example, multiplexer M_(a) ^((n−1)) 324 is communicatively coupled to multiplxer M_(b) ^((n−1)) 326 that is in turn communicatively coupled to multiplexer M_(c) ^((n−1)) 328. Multiplexer M_(a) ⁰ 330 is communicatively coupled to multiplxer M_(b) ⁰ 332 that is in turn communicatively coupled to multiplexer M_(c) ⁰ 334. However, multiplexer M_(a) ^(n) 322, being the sole member in its family is communicatively coupled only to one multiplexer that belongs to another family, viz., multiplexer M_(b) ^((n−1)) 326.

[0060] Selection inputs such as, Last-X^((n−1)) 352, Last-X^((n−2)) (not shown in FIG. 3A), . . . , Last-X⁰ 354, are received as inputs into corresponding multiplexers with subscripts “b” and “c” and that belong to the same family. For example, Last-X^((n−1)) 352 is a selection input into multiplexers M_(b) ^((n−1)) 326 and M_(c) ^((n−1)) 328, and Last-X⁰ 354 is a selection input into multiplexers M_(b) ⁰ 332 and M_(c) ⁰ 334, etc.

[0061] Further, all selection inputs, namely, Last-X^((n−1)) 352, Last-X^((n−2)) (not shown in FIG. 3A), . . . , Last-X⁰ 354 are input into multiplexer M_(out) 342. It is to be noted that, in certain embodiments, there is no Last-X^(n) selection input.

[0062] For simplicity in explaining the function of the components in FIG. 3A, selection inputs such as Last-X^((n−1)) 352, Last-X^((n−2)) (not shown in FIG. 3A), . . . , Last-X⁰ 354 are collectively referred to herein as Last-X selection inputs.

[0063] Generally, selection inputs such as, Last-X^((n−1)) 352, Last-X^((n−2)) (not shown in FIG. 3A), . . . , Last-X⁰ 354, are programmed to be a specific value based on the most significant bit (MSB) of the Y registers. For purposes of illustration, assume that the given polynomial key word is a q^(th) order polynomial, where q is a positive integer that is less than N. FIG. 4 is a block diagram that illustrates the position of the MSB that is associated with a q^(th) order polynomial key word.

[0064] In FIG. 4, bit B_(n) has the value of the Y^(n) register that is programmed as described herein. Bit B_(n−1) has the value of the Y^(n−1) register, bit B_(n−2) has the value of the Y^(n−2) register, . . . , bit B_(q) has the value of the Y^(q) register, bit B_(q−1) has the value of the Y_(q−1) register, bit B_(q−2) has the value of the Y^(q−2) register, . . . , bit B₂ has the value of the Y² register, bit B₁ has the value of the Y¹ register, and bit B₀ has the value of the Y⁰ register.

[0065] Since the given polynomial key word is a q^(th) order polynomial, the first occurring “1” bit corresponds to the value of the Y^(q) register. In FIG. 4, the first occurring “1” bit is in Y^(q) register and so Y^(q) is the MSB. Since the first “1” bit corresponds to the value of the Y^(q) register, the i) selection input Last-X^(q) (not shown in FIG. 3A) is programmed to be equal to 1. All other selection inputs such as, Last-X^(n−1) 352, Last-X^(n−2) (not shown in FIG. 3A), . . . , Last-X⁰ 354, are programmed to have a value of zero.

[0066] The value of each selection input, such as Last-X^(n−1) 352, Last-X^(n−2) (not shown in FIG. 3A), . . . , Last-X⁰ 354 determines which input lines 362, 370, 394, 358, 392, . . . , 387, 386, 395, 358, is selected at the corresponding multiplexers, M_(b) ^(n−1) M_(c) ^(n−1), . . . , M_(b) ⁰, M_(c) ⁰ to be output from the multiplexers M_(b) ^(n−1) M_(c) ^(n−1), . . . , M_(b) ⁰, M_(c) ⁰.

[0067] For example, if selection input Last-X^(n−1) 352 is programmed to have the value of 1, multiplexer M_(b) ^(n−1) 326 and multiplexer M_(c) ^(n−1) 328 will each receive the value 1 as an input. In FIG. 3A, it can be seen that multiplexer M_(b) ^(n−1) 326 and multiplexer M_(c) ^(n−1) 328 each has 2 input lines, labeled “1” and “0”. Since the value 1 is received as the selection input by multiplexer M_(b) ^(n−1) and multiplexer M_(c) ^(n−1), multiplexer M_(b) ^(n−1) and multiplexer M_(c) ^(n−1) will each select the input line labeled “1” to be their output for a particular cycle.

[0068] As explained herein, there is no Last-X^(n) selection input because there are no multiplexers that control the primary input into the XOR gate, XOR^(n) 316. XOR^(n) 316, being the first XOR gate in an N-bit capable CRC generator will always receive the primary input.

[0069] In FIG. 3A, multiplexer M_(out) 342 has N+1 input lines, namely, A^(n) 344, A^(n−1) 346, . . . , up to A⁰ 348. If selection input Last-X^(n−1) 352 has a value of 1, then multiplexer M_(out) 342 will select A^(n−1) 346 to be CRC output 350. Similarly, if Last-X^(n−2) (not shown in FIG. 3A) has a value of 1, then multiplexer M_(out) 342 will select A^(n−2) (not shown in FIG. 3A) to be CRC output 350, and so on.

[0070] Even though there is no Last-X^(n) selection input, the effect of a selection input Last-X^(n) can be obtained by making the selection of A^(n) 344 as the default selection when all the selection inputs, namely, Last-X^((n−1)) 352, Last-X^((n−2)) (not shown in FIG. 3A), Last-X⁰ 354 have a value of zero.

[0071] Additionally, multiplexers with the subscript “b”, such as M_(b) ^((n−1)) 326, M_(b) ^((n−2)) (not shown in FIG. 3A), M_(b) ^((n−3)) (not shown in FIG. 3A), . . . , M_(b) ⁰ 332 are communicatively coupled to each other. Specifically, line 392 is an output line from M_(b) ^((n−1)) 326. Line 392 is also an input line to M_(b) ^((n−2)) (not shown in FIG. 3A). As previously explained herein, line 393 is shown as an output line from multiplexer M_(b) ⁰ 332. Line 393 is also an input line to shift register X⁰ 314.

[0072] Multiplexers with the subscript “c” each receive a primary input, P 356. For example, multiplexers M_(c) ^((n−1)) 328, M_(c) ^((n−2)) (not shown in FIG. 3A), M_(c) ^((n−3)) (not shown in FIG. 3A), . . . , M_(c) ⁰ 334 each receive a primary input, P 356. XOR gate XOR^(n) 316 also receives primary input, P 356. Typically, primary input P 356 is a bitstream that is input into the XOR gates at the rate of one bit per cycle.

[0073] All multiplexers in the N-bit capable CRC generator have 2 input lines. One input line is labeled “1” and the other input line is labeled “0” as indicated in FIG. 3A.

[0074] The arrangement of the components in List B, i.e. the components that not shown in FIG. 3A, are the same as the arrangement of the components Y^((n−1)) 338, XOR^((n−1)) 318, M_(a) ^((n−1)) 324, M_(b) ^((n−1)) 326, and M_(c) ^((n−1)) 328 relative to each other.

[0075] 3.0 Illustrative Example of the Flexibility of an N-Bit Capable CRC Generator

[0076] Typically, N is equal to 64 or larger for the universal CRC generator. However, for simplicity of explanation, assume that that N=3 for the N-bit capable CRC generator. FIG. 5 is a block diagram that illustrates a 3-bit capable CRC generator 500. A 3-bit capable CRC generator can be used for polynomial key words of orders ranging from 1 to 3.

[0077] In FIG. 5, shift register X³ 506 is communicatively coupled to corresponding XOR gate, XOR³ 504. Specifically, line 550 is an output line from shift register X³ 506. Line 550 is also an input line to XOR gate, XOR³ 504.

[0078] Further, shift register X³ 506 is communicatively coupled to adjacent multiplexers M_(a) ³ 502 and M_(a) ² 508. Specifically, line 548 is an output line from shift register X³ 506. Line 548 is also an input line into M_(a) ³ 502. Line 554 is output line from M_(a) ² 508. Line 554 is also an input line into shift register X³ 506.

[0079] Similarly, shift register X² 516 is communicatively coupled to corresponding XOR gate, XOR² 514, and to adjacent multiplexers M_(a) ² 508 and M_(a) ¹ 518. Specifically, line 566 is an output line from shift register X² 516. Line 566 is also an input line to XOR gate, XOR² 514. Line 568 is an output line from shift register X² 516. Line 568 is also an input line into multiplexer M_(a) ² 508. Line 572 is output line from multiplexer M_(a) ¹ 518. Line 572 is also an input line into shift register X² 516.

[0080] Shift register X¹ 526 is communicatively coupled to corresponding XOR gate, XOR¹ 524, and to adjacent multiplexers M_(a) ¹ 518 and M_(a) ³ 528. Specifically, line 584 is an output line from shift register X¹ 526. Line 584 is also an input line to XOR gate, XOR¹ 524. Line 586 is an output line from shift register X¹ 526. Line 586 is also an input line into multiplexer M_(a) ¹ 518. Line 590 is output line from multiplexer M_(a) ⁰ 528. Line 590 is also an input line into shift register X¹ 526.

[0081] Shift register X⁰ 536 is communicatively coupled to XOR gate, XOR⁰ 534. In addition, shift register X⁰ 536 is communicatively coupled to adjacent multiplexer M_(a) ⁰ 528. Specifically, line 595 is an output line from shift register X⁰ 536. Line 595 is also an input line to XOR gate, XOR⁰ 534. Line 593 is an output line from shift register X⁰ 536. Line 593 is also an input line into multiplexer M_(a) ⁰ 528. Line 590 is output line from multiplexer M_(a) ⁰ 528.

[0082] Further, all shift registers X³ 506, X² 516, X¹ 526, X⁰ 536 are communicatively coupled to multiplexer M_(out) 589 via output lines A³ 546, A² 570, A¹ 588, and A⁰ 591, respectively. CRC Output 534 is the output of the 3-bit capable CRC generator 500.

[0083] Each XOR gate is additionally communicatively coupled to either one or two corresponding adjacent multiplexers. In FIG. 5, XOR gate, XOR³ 504 is communicatively coupled to one adjacent corresponding multiplexer M_(a) ³ 502. Line 552 is an output line from XOR gate, XOR³ 504. Line 552 is also an input line to multiplexer M_(a) ³ 502.

[0084] Similarly, XOR gate, XOR² 514, is communicatively coupled to adjacent corresponding multiplexers M_(a) ² 508 and M_(c) ² 512. Line 564 is an output line from XOR gate, XOR² 514. Line 564 is also an input line to multiplexer M_(a) ² 508. Line 562 is an output line from multiplexer M_(c) ² 512. Line 562 is also an input line to XOR gate, XOR² 514.

[0085] XOR gate, XOR¹ 524, is communicatively coupled to adjacent corresponding multiplexers M_(a) ¹ 518 and M_(c) ¹ 522. Line 582 is an output line from XOR gate, XOR¹ 524. Line 582 is also an input line to multiplexer M_(a) ¹ 518. Line 580 is an output line from multiplexer M_(c) ¹ 522. Line 580 is also an input line to XOR gate, XOR¹ 524.

[0086] XOR gate, XOR⁰ 534, is communicatively coupled to adjacent corresponding multiplexers M_(a) ⁰ 528 and M_(c) ¹ 532. Line 597 is an output line from XOR gate, XOR⁰ 534. Line 597 is also an input line to multiplexer M_(a) ⁰ 528. Line 598 is an output line from multiplexer M_(c) ⁰ 532. Line 598 is also an input line to XOR gate, XOR⁰ 534.

[0087] Programmable registers Y³ 538, Y² 540, Y¹ 542, and Y⁰ 544 are each communicatively coupled to corresponding multiplexers M_(a) ³ 502, M_(a) ² 508, M_(a) ¹ 518, M_(a) ⁰ 528 respectively.

[0088] For example, programmable register Y³ 502 is communicatively coupled to M_(a) ³ 502. Similarly, programmable register Y² 540 is coupled to M_(a) ² 508. Programmable register Y¹ 532 is coupled to M_(a) ¹ 518. Programmable register Y⁰ 544 is coupled to M_(a) ⁰ 528.

[0089] For ease of explanation, multiplexers with the same superscript as illustrated in FIG. 5 are said to belong to the same family. As can be seen in FIG. 5, multiplexers that belong to the same family are communicatively coupled to form part of a feedback loop. For example, multiplexer M_(a) ² 508 is communicatively coupled to mulitplexer M_(b) ² 510 that is in turn communicatively coupled to mulitplexer M_(c) ² 512. Specifically, line 556 is an output line from multiplexer M_(a) ² 508. Line 556 is also an input line to multiplexer M_(b) ² 510. Line 560 is an input line from multiplexer M_(b) ² 510 to mulitplexer M_(c) ² 512.

[0090] Similarly, M_(a) ¹ 518 is communicatively coupled to M_(b) ¹ 520 that is in turn communicatively coupled to M_(c) ¹ 522. Specifically, line 574 is an output line from multiplexer M_(a) ¹ 518. Line 574 is also an input line to multiplexer M_(b) ¹ 520. Line 578 is an input line from multiplexer M_(b) ¹ 520 to mulitplexer M_(c) ¹ 522.

[0091] M_(a) ⁰ 528 is communicatively coupled to M_(b) ⁰ 530 that is in turn communicatively coupled to M_(c) ⁰ 532. Specifically, line 592 is an output line from multiplexer M_(a) ⁰ 528. Line 592 is also an input line to multiplexer M_(b) ⁰ 530. Line 596 is an input line from multiplexer M_(b) ⁰ 530 to mulitplexer M_(c) ⁰ 532.

[0092] However, M_(a) ³ 502, being the sole member in its family is communicatively coupled to multiplexer M_(b) ² 510. Line 547 is an output line from multiplexer M_(a) ³ 502 to multiplexer M_(b) ² 510.

[0093] Inputs Last-X² 583, Last-X¹ 587, and Last-X⁰ 585 are selection inputs into corresponding multiplexers with subscripts “b” and “c” and which belong to the same family. For example, Last-X² 583 is a selection input into multiplexers M_(b) ² 510 and M_(c) ² 512. Last-X¹ 587 is a selection input into multiplexers M_(b) ¹ 520 and M_(c) ¹ 522. Last-X⁰ 585 is a selection input into multiplexers M_(b) ⁰ 530 and M_(c) ⁰ 532. Further, all selection inputs Last-X² 583, Last-X¹ 587, and Last-X⁰ 585 are input into multiplexer M_(out) 589.

[0094] Additionally, multiplexers with the subscript “b”, such as M_(b) ² 510, M_(b) ¹ 520. M_(b) ⁰ 530 are communicatively coupled to each other. Multiplexers with the subscript “c” each receive a primary input, P 501 through line 503. For example, multiplexers M_(c) ² 512, M_(c) ¹ 522 and, M_(c) ⁰ 532 each receive a primary input, P 501. XOR gate XOR³ 504 also receives primary input, P 501 through line 503. Typically, primary input P 501 is a bitstream that is to be checked for error by the CRC generator 500. Primary input P 501 is input into the XOR gates at the rate of one bit per cycle.

[0095] As a first illustration, assume that a CRC generator is needed to implement a given 320 polynomial key word of order 3. Further assume that the given polynomial is as follows:

X³+X²+1

[0096] The 3-bit capable CRC described with reference to FIG. 5 can be converted to specifically implement the polynomial key word, X³+X²+1. In other words, by programming the values of the Y registers and the Last-X selection inputs, the 3-bit capable CRC generator becomes a X³+X²+1 key word CRC generator. For purposes of explanation, the given polynomial key word is re-written to explicitly show coefficients and missing terms. Thus, the given polynomial key word, X³+X²+1, can be re-written as:

(1)X ³+(1)X ²+(0)X ¹+(1)X⁰

[0097] Referring to FIG. 5, programmable register Y³ 538 corresponds to coefficient of X³ of the given key word polynomial. Thus, programmable register Y³ 538 is programmed to have the value of 1. In response to receiving the value of 1 from programmable register Y³ 538, multiplexer M_(a) ³ 502, will select input line labeled “1”.

[0098] Similarly, programmable register Y² 540 corresponds to coefficient X² of the given key word polynomial. Thus, programmable register Y² 540 is programmed to have the value of 1. In response to receiving the value of 1 from programmable register Y² 540, multiplexer M_(a) ² 508, will select input line labeled “1”.

[0099] Programmable register Y¹ 542 corresponds to coefficient X¹ of the given key word polynomial. Thus, programmable register Y¹ 542 is programmed to have the value of 0. In response to receiving the value of 0 from programmable register Y¹ 542, multiplexer M_(a) ¹ 518, will select input line labeled “0”.

[0100] Programmable register Y⁰ 544 corresponds to coefficient X⁰ of the given key word polynomial. Thus, programmable register Y⁰ 544 is programmed to have the value of 1. In response to receiving the value of 1 from programmable register Y⁰ 544, multiplexer M_(a) ⁰ 528, will select input line labeled “1”.

[0101] The Last-X selection inputs are programmed to be a specific value based on the most significant bit (MSB). FIG. 6 is a block diagram that illustrates the position of the MSB that is associated with the polynomial key word, X³+x²+1. In FIG. 6, bit 610 has the value of the Y³ register that is programmed to have a value of 1 described above. Since the first occurring “1” bit corresponds to the value of the Y³ register, bit 610 represents the MSB.

[0102] Similarly, bit 612 has the value of the Y² register that is programmed to have a value of 1. Bit 614 has the value of the Y¹ register that is programmed to have a value of 0. Bit 616 has the value of the Y⁰ register that is programmed to have a value of 1. Bit 616 is the LSB.

[0103] Since the first occurring “1” bit corresponds to the value of the Y³ register, all Last-X selection inputs, namely, Last-X² 583, Last-X¹ 587, and Last-X¹ 585 in FIG. 5 are programmed to have a value of zero.

[0104] The value of each Last-X selection input determines which input is selected at the corresponding multiplexers to be output from said multiplexers. For example, since selection input Last-X² 583 is programmed to have the value of 0, multiplexer M_(b) ² 510 and multiplexer M_(c) ² 512 will each receive the value 0 as an input. In FIG. 5, it can be seen that multiplexer M_(b) ² 510 and multiplexer M_(c) ² 512 each has 2 input lines, labeled “1” and “0”. Since the value 0 is received as the selection input, multiplexer M_(b) ² 510 and multiplexer M_(c) ² 512 will each select the input line labeled “0” to be their output for a particular cycle.

[0105] In FIG. 5, multiplexer M_(out) 589 has 4 input lines, namely, A³ 546, A² 570, A¹ 588, A⁰ 591. Since all the selection inputs, namely, Last-X² 583, Last-X¹ 587, Last-X⁰ 585, have the value of 0, multiplexer M_(out) 589 will select A³ 546 to be CRC output 534.

[0106] Thus, by programming the Y registers and the Last-X selection inputs as described above, the 3-bit capable CRC generator is equivalent to the CRC generator as described in FIG. 1 herein.

[0107] Further, the same 3-bit capable CRC generator can be programmed to implement a given polynomial key word that is of an order that is lower than 3. Assume that the given polynomial is as follows:

X¹+1

[0108] For purposes of explanation, the given polynomial key word, X¹+1, is re-written to explicitly show coefficients and missing terms. Thus, the given polynomial key word, X¹+1, can be re-written as:

(0)X ³+(0)X ¹+(1)X ¹+(1)X ⁰

[0109] In FIG. 5 programmable register Y³ 538 corresponds to coefficient of X³ of the given key word polynomial. Thus, programmable register Y³ 538 is programmed to have the value of 0. In response to receiving the value of 0 from programmable register Y³ 538, multiplexer M_(a) ³ 502, will select input line labeled “0”.

[0110] Similarly, programmable register Y² 540 corresponds to coefficient X² of the given key word polynomial. Thus, programmable register Y² 540 is programmed to have the value of 0. In response to receiving the value of 0 from programmable register Y² 540, multiplexer M_(a) ² 508, will select input line labeled “0”.

[0111] Programmable register Y¹ 542 corresponds to coefficient X¹ of the given key word polynomial. Thus, programmable register Y¹ 542 is programmed to have the value of 1. In response to receiving the value of 1 from programmable register Y¹ 542, multiplexer M_(a) ¹ 518, will select input line labeled “1”.

[0112] Programmable register Y⁰ 544 corresponds to coefficient X⁰ of the given key word polynomial. Thus, programmable register Y⁰ 544 is programmed to have the value of 1. In response to receiving the value of 1 from programmable register Y⁰ 544, multiplexer M_(a) ⁰ 528, will select input line labeled “1”.

[0113] The Last-X selection inputs are programmed to be a specific value based on the most significant bit (MSB) of the Y registers. FIG. 7 is a block diagram that illustrates the position of the MSB that is associated with a X¹+X⁰ key word. In FIG. 7, bit 710 has the value of the register Y³ that is programmed to have a value of 0 described above. Similarly, bit 712 has the value of the Y² register that is programmed to have a value of 0.

[0114] Bit 714 has the value of the Y¹ register that is programmed to have a value of 1. Since the first occurring “1” bit corresponds to the value of the Y¹ register, bit 714 represents the MSB. Bit 716 has the value of the Y⁰ register that is programmed to have a value of 1. Bit 716 is the LSB.

[0115] Since the first occurring “1” bit corresponds to the value of register Y¹, selection input Last-X¹ 587 is programmed to have a value of 1, and selection inputs Last-X² 583 and Last-X⁰ 585are programmed to have a value of 0.

[0116] The value of each Last-X selection input determines which input is selected at the corresponding multiplexers to be output from said multiplexers.

[0117] Referring back to FIG. 5, since selection input Last-X² 583 has the value 0, multiplexer M_(b) ² 510 and multiplexer M_(c) ² 512 will each select the input line labeled “0” to be their output for a particular cycle. Similarly, since selection input Last-X⁰ 585 has the value 0, multiplexer M_(b) ⁰ 530 and multiplexer M_(c) ⁰ 532 will each select the input line labeled “0” to be their output for a particular cycle.

[0118] In contrast, since selection input Last-X¹ 587 has the value 1, multiplexer M_(b) ¹ 520 and multiplexer M_(c) ¹ 522 will each select the input line labeled “1” to be their output for a particular X⁰ cycle.

[0119] In FIG. 5, multiplexer M_(out) 589 has 4 input lines, namely, A³ 546, A² 570, A¹ 588, A⁰ 591. Since the selection input Last-X¹ 587 has the value of 1, multiplexer M_(out) 589 will select A¹ 588 to be CRC output 534.

[0120] Thus, by programming the Y registers and the Last-X selection inputs as described above, the 3-bit capable CRC generator 500 is equivalent to the CRC generator as described in FIG. 2.

[0121] 5.0 Extensions and Alternatives

[0122] In the foregoing specification, the invention has been described with reference to specific embodiments thereof. It will, however, be evident that various modifications and changes may be made thereto without departing from the broader spirit and scope of the invention. The specification and drawings are, accordingly, to be regarded in an illustrative rather than a restrictive sense. 

What is claimed is:
 1. A method for generating a Cyclic Redundancy Check (CRC) in a system comprising the steps of: creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and programming a subset of the plurality of registers to have a value of zero and programming a corresponding subset of the logic gates to have a value of zero, wherein the step of programming is based on a pre-selected polynomial key word.
 2. The method as recited in claim 1, wherein the step of programming comprises: programming a first set of selection inputs, wherein: the step of programming the first set of selection inputs is based on the pre-selected polynomial key word; the first set of selection inputs is associated with: selecting corresponding input from each of the logic gates; and a shift logic that is associated with the plurality of registers.
 3. The method as recited in claim 1, wherein the step of programming comprises: the programming a second set of selection inputs, wherein: the second set of selection inputs is associated with selecting corresponding input to each of the logic gates; the second set of selection inputs is associated with selecting a final output from among output from the plurality of registers; and the step of programming the second set of selection inputs is based on the pre-selected polynomial key word.
 4. The method as recited in claim 1, further comprising: using a first set of multiplexers in conjunction with a first set of selection inputs for selecting at least one input for shifting data to a next shift register of the plurality of registers, wherein the at least one input is a member of a set of inputs that includes an output from an adjacent logic gate and a straight shift input from an adjacent register of the plurality of registers.
 5. The method as recited in claim 1, further comprising: using a second set of multiplexers in conjunction with a second set of selection inputs for selecting at least one input to a corresponding logic gate, wherein the at least one input is a member of a set of inputs that includes a primary input and a feedback input.
 6. The method as recited in claim 1, further comprising: using a second set of multiplexers in conjunction with a second set of selection inputs for selecting a final output from among output from the plurality of registers.
 7. The method as recited in claim 1, wherein the plurality of registers are shift registers.
 8. A method for generating a Cyclic Redundancy Check (CRC) generator in a system comprising the steps of: creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and programming a first set of selection inputs, wherein: the step of programming the first set of selection inputs is based on a pre-selected polynomial that is associated with the CRC generator; the first set of selection inputs is associated with: selecting corresponding input from each of the one or more logic gates; and a shift logic that is associated with the plurality of registers; and programming a second set of selection inputs, wherein: the second set of selection inputs is associated with selecting corresponding input to each logic gate; the second set of selection inputs is associated with selecting a final output from among output from the plurality of registers; and the step of programming the second set of selection inputs is based on the pre-selected polynomial that is associated with the CRC generator.
 9. The method as recited in claim 8, further comprising: using a first set of multiplexers in conjunction with the first set of selection inputs for selecting at least one input for shifting to a next register of the plurality of registers, wherein the at least one input is a member of a set of inputs that includes an output from an adjacent logic gate and a straight shift from an adjacent register of the plurality of registers.
 10. The method as recited in claim 8, further comprising: a using a second set of multiplexers in conjunction with the second set of selection inputs for selecting at least one input to a corresponding logic gate, wherein the at least one input is a member of a set of inputs that includes a primary input and a feedback input.
 11. The method as recited in claim 8, further comprising: using a second set of multiplexers in conjunction with the second set of selection inputs for selecting the final output from among output from the plurality of registers.
 12. The method as recited in claim 8, wherein the plurality of registers are shift registers.
 13. A computer-readable medium carrying one or more sequences of instructions for generating a Cyclic Redundancy Check (CRC) generator in a system, which instructions, when executed by one or more processors, cause the one or more processors to carry out the steps of: creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and programming a subset of the plurality of registers to have a value of zero and programming a corresponding subset of the logic gates to have a value of zero, wherein the step of programming is based on a pre-selected polynomial key word.
 14. A computer-readable medium carrying one or more sequences of instructions for generating a Cyclic Redundancy Check (CRC) generator in a system, which instructions, when executed by one or more processors, cause the one or more processors to carry out the steps of: creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and programming a first set of selection inputs, wherein: the step of programming the first set of selection inputs is based on a pre-selected polynomial that is associated with the CRC generator; the first set of selection inputs is associated with: selecting corresponding input from each of the one or more logic gates; and a shift logic that is associated with the plurality of registers; and programming a second set of selection inputs, wherein: the second set of selection inputs is associated with selecting corresponding input to each logic gate; the second set of selection inputs is associated with selecting a final output from among output from the plurality of registers; and the step of programming the second set of selection inputs is based on the pre-selected polynomial that is associated with the CRC generator.
 15. An apparatus for creating a Cyclic Redundancy Check (CRC) generator in a system, comprising: means for creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and means for programming a subset of the plurality of registers to have a value of zero and programming a corresponding subset of the logic gates to have a value of zero, wherein the step of programming is based on a pre-selected polynomial key word.
 16. An apparatus for creating a Cyclic Redundancy Check (CRC) generator in a system, comprising: means for creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and means for programming a first set of selection inputs, wherein: the step of programming the first set of selection inputs is based on a pre-selected polynomial that is associated with the CRC generator; the first set of selection inputs is associated with: selecting corresponding input from each of the one or more logic gates; and a shift logic that is associated with the plurality of registers; and means for programming a second set of selection inputs, wherein: the second set of selection inputs is associated with selecting corresponding input to each logic gate; the second set of selection inputs is associated with selecting a final output from among output from the plurality of registers; and means for the step of programming the second set of selection inputs is based on the pre-selected polynomial that is associated with the CRC generator.
 17. An apparatus for creating a Cyclic Redundancy Check (CRC) generator in a system, comprising: a processor; one or more stored sequences of instructions which, when executed by the processor, cause the processor to carry out the steps of: creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and programming a subset of the plurality of registers to have a value of zero and programming a corresponding subset of the logic gates to have a value of zero, wherein the step of programming is based on a pre-selected polynomial key word.
 18. An apparatus for creating a Cyclic Redundancy Check (CRC) generator in a system, comprising: a processor; one or more stored sequences of instructions which, when executed by the processor, cause the processor to carry out the steps of: creating a circuit comprising a plurality of registers wherein each of the plurality of registers is associated with a corresponding logic gate; and programming a first set of selection inputs, wherein: the step of programming the first set of selection inputs is based on a pre-selected polynomial that is associated with the CRC generator; the first set of selection inputs is associated with: selecting corresponding input from each of the one or more logic gates; and a shift logic that is associated with the plurality of registers; and programming a second set of selection inputs, wherein: the second set of selection inputs is associated with selecting corresponding input to each logic gate; the second set of selection inputs is associated with selecting a final output from among output from the plurality of registers; and the step of programming the second set of selection inputs is based on the pre-selected polynomial that is associated with the CRC generator. 